<?php

define('UC_CHARS_LATIN1', "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝ");
define('LC_CHARS_LATIN1', "àáâãäåæçèéêëìíîïðñòóôõöøùúûüý");

require_once APPPATH . 'dao/TipoDocumentoDAO.php';
require_once APPPATH . 'dao/CategoriaDAO.php';
require_once APPPATH . 'dao/SocioDAO.php';
require_once APPPATH . 'dao/ValoresInscripcionDAO.php';
require_once APPPATH . 'dao/EstadoCierreRecaudacionDAO.php';

class Inscripcion extends MY_Controller {

    function __construct() {
        parent::__construct();
    }

    /*
     * index() se ejecuta por defecto al ser cargado del controlador
     */

    public function index() {
        //Se comprueba si el controlador es invocado por primera vez, o
        //si es invocado como producto de enviar el formulario en la vista
        //formularioFiltrado.php
        if (!$this->input->post('submit')) {
            //Si el controlador es invocado por primera vez, se carga la vista inicial
            $this->cargarVista();
        } else {
            //Si el controlador es cargado por el envío del formulario, entonces
            //son validados los datos enviados desde éste
            $this->validarInscripcion();
        }
    }

    /*
     * Se encarga de cargar las vistas correspondientes al formulario de búsqueda
     * y la respuesta de la búsqueda
     */

    public function cargarVista($mensaje = null) {
        //Se obtienen los datos para crear los campos del formulario
        $dataFormularioInscripcion = $this->obtenerCamposInscripcion($mensaje);
        $dataFormularioInscripcion['mensaje'] = $mensaje;

        $dataCab['title'] = 'Sistema de Administración de Socios';
        $dataCab['textoSuperiorIzq'] = 'DEFENSORES DE LA TECNO';
        $dataCab['css'] = '<link rel="stylesheet" type="text/css" href="' . site_url() . 'application/views/css_estandar/css_pestanias.css" media="screen" />
                               <link rel="stylesheet" type="text/css" href="' . site_url() . 'application/views/css_estandar/datos_form_css.css" media="screen" />';


        $dataCab['nombre'] = 'Administrador';
        $dataCab['posicionamiento'] = 'Home > Inscribir Socio';

        //Se carga una cabecera, que contiene el head y las etiquetas de apertura
        //de html y body
        $this->load->view('cabecera', $dataCab);
        //Se carga el formulario de inscripcion de socios
        $this->load->view('formularioInscripcion', $dataFormularioInscripcion);
        //Se carga una vista con etiquetas de cierre de html y body
        $this->load->view('cierre');
    }

    /*
     * Retorna arreglos con los parámetros necesarios para crear los campos del
     * formulario.
     * Dichos parámetros son pasados a métodos del Form Helper de CodeIgniter
     */

    public function obtenerCamposInscripcion($mensaje = null) {

        /* Campo Apellido */
        $data['apellido'] = array(
            'name' => 'apellido',
            'id' => 'apellido',
            'value' => isset($mensaje) ? "" : set_value('apellido'),
            'maxlength' => '30',
            'size' => '35',
        );

        /* Campo Nombre */
        $data['nombre'] = array(
            'name' => 'nombre',
            'id' => 'nombre',
            'value' => isset($mensaje) ? "" : set_value('nombre'),
            'maxlength' => '30',
            'size' => '35',
        );

        /* Campo Domicilio */
        $data['domicilio'] = array(
            'name' => 'domicilio',
            'id' => 'domicilio',
            'value' => isset($mensaje) ? "" : set_value('domicilio'),
            'maxlength' => '50',
            'size' => '55',
        );

        /* Campo Domicilio de Cobro */
        $data['domicilio_cobro'] = array(
            'name' => 'domicilio_cobro',
            'id' => 'domicilio_cobro',
            'value' => isset($mensaje) ? "" : set_value('domicilio_cobro'),
            'maxlength' => '50',
            'size' => '55',
        );

        /* Lista Tipo Documento */
        $tipoDocDAO = new TipoDocumentoDAO();
        $tipos = $tipoDocDAO->getTipoDocumento();
        $data['tiposDocumento'] = array();
        foreach ($tipos as $tipo)
            $data['tiposDocumento'][$tipo->getId()] = $tipo->getNombre();

        /* Campo Numero Documento */
        $data['numeroDocumento'] = array(
            'name' => 'numeroDocumento',
            'id' => 'numeroDocumento',
            'value' => isset($mensaje) ? "" : set_value('numeroDocumento'),
            'maxlength' => '8',
            'size' => '15',
        );

        /* Campo Zona */
        $data['zona'] = array(
            'name' => 'zona',
            'id' => 'zona',
            'value' => isset($mensaje) ? "" : set_value('zona'),
            'maxlength' => '2',
            'size' => '10',
        );

        /* Campo Fecha de Nacimiento */
        $data['fechaNacimiento'] = array(
            'name' => 'fechaNacimiento',
            'id' => 'fechaNacimiento',
            'value' => isset($mensaje) ? "" : set_value('fechaNacimiento'),
            'maxlength' => '10',
            'size' => '12',
            'type' => 'text',
            'class' => 'one',
            'onkeypress' => 'return false;'
        );

        $valoresInscripcionDAO = new \ValoresInscripcionDAO();

        $valorActual = $valoresInscripcionDAO->getValorInscripcion();

        $data['valor'] = $valorActual->getValor();

        return $data;
    }

    /*
     * Toma la decisión de cargar la vista inicial mostrando los errores cometidos
     * al cargar el formulario, o de cargar la vista nuevamente pero con el resultado
     * de la búsqueda
     */

    public function validarInscripcion() {
        //Primero valida que todos los campos del formulario sean correctos.
        //Si no es así, vuelve a mostrar el formulario con los respectivos errores.
        if ($this->validacionDatosInscripcion() === FALSE) {
            $this->cargarVista();
        } else {

            if ($this->altaSocio()) {

                $socioDAO = new \SocioDAO();

                $socioInscripto = $socioDAO->getSocioBy($this->input->post('numeroDocumento'), 'numero_documento', 'integer');

                $mensaje = 'El Socio ' . $socioInscripto->getApellido() . ', ' . $socioInscripto->getNombre() . ' ha sido Inscripto con éxito con el Nº ' . $socioInscripto->getId();
            }
            else
                $mensaje = 'Ha ocurrido un error al guardar el nuevo Socio';

            $this->cargarVista($mensaje);
        }
    }

    /*
     * Valida los datos introducidos en el formulario mediante el uso de la librería
     * Form_validation de CodeIgniter
     */

    public function validacionDatosInscripcion() {

        //Regla que valida los datos ingresados en el campo apellido del formulario
        //Éste campo sólo admite letras, apóstrofes y espacios en blanco y es de hasta 30 caracteres
        //Además, se comprueba si no se está haciendo un ataque de SQL Injection o XSS
        $this->form_validation->set_rules('apellido', 'Apellido', 'required|alphaApostropheSpace|max_length[30]|xss_clean|cleanQuery');

        $this->form_validation->set_rules('nombre', 'Nombre', 'required|alphaApostropheSpace|max_length[30]|xss_clean|cleanQuery');

        $this->form_validation->set_rules('domicilio', 'Domicilio', 'required|alphaApostropheSpaceNum|max_length[50]|xss_clean|cleanQuery');

        $this->form_validation->set_rules('domicilio_cobro', 'Domicilio de Cobro', 'alphaApostropheSpaceNum|max_length[50]|xss_clean|cleanQuery');

        $this->form_validation->set_rules('fechaNacimiento', 'Fecha de Nacimiento', 'required|xss_clean|cleanQuery');

        $this->form_validation->set_rules('zona', 'Zona', 'required|numeric|max_length[2]|formatoNumeroDeZona|rangoZona|xss_clean|cleanQuery');

        //Regla que valida los datos ingresados en el campo numero documento del formulario
        //Éste campo sólo admite números y una longitud de 8
        //Además, se comprueba si no se está haciendo un ataque de SQL Injection o XSS
        $this->form_validation->set_rules('numeroDocumento', 'N&ordm; Documento', 'required|numeric|min_length[7]|max_length[8]|unique[models\M_socio,numero_documento,integer]|fotmatoNumeroDeDocumento|menorNumeroDeDocumentoPosible|xss_clean|cleanQuery');

        //$this->form_validation->set_rules('fechaNacimiento', 'Fecha de Nacimiento', 'required|validar_formato|validar_fecha|validar_nacimiento');
        //Se ejecutan las reglas establecidas sobre los campos del formulario en cuestión
        //y se retornan los resultados de la validación
        return $this->form_validation->run();
    }

    /**
     * Se invoca un método en SocioDAO que persistirá al nuevo socio en la base de datos.
     * Los campos que aceptan letras, se normalizan pasándolas a mayúsculas.
     * 
     * @return type 
     */
    private function altaSocio() {

        $socioDAO = new \SocioDAO();
        $categoriaDAO = new \CategoriaDAO();

        $nombre = $this->fullUpper($this->input->post('nombre'));
        $apellido = $this->fullUpper($this->input->post('apellido'));
        $domicilio = $this->fullUpper($this->input->post('domicilio'));
        $domicilio_cobro = $this->fullUpper($this->input->post('domicilio_cobro'));

        if ($domicilio_cobro == '')
            $domicilio_cobro = $domicilio; // si el usuario no ingresa domicilio de cobro se asume que es el mismo 

        $fecha_nacimiento = date("d-m-Y", strtotime($this->input->post('fechaNacimiento')));


        return $socioDAO->insertarSocio($nombre, $apellido, $this->input->post('tipoDocumento'), $this->input->post('numeroDocumento'), $domicilio, $domicilio_cobro, $this->input->post('fechaNacimiento'), $this->input->post('zona'), $categoriaDAO->getCategoriaIdByFechaNacimiento($fecha_nacimiento));
    }

    private function fullUpper($str) {

        $str = strtoupper(strtr($str, LC_CHARS_LATIN1, UC_CHARS_LATIN1));
        return strtr($str, array("ß" => "SS"));
    }

    public function test() {

        $categoriaDAO = new \CategoriaDAO();


        $i = 0;

        $test = $categoriaDAO->getCategoriaIdByFechaNacimiento('02-03-1991');
        $test_name = 'Prueba ' . ++$i . ' - Prueba metodo calcular categoria cadete';
        $expected_result = 2;

        $this->unit->run($test, $expected_result, $test_name);


        $test = $categoriaDAO->getCategoriaIdByFechaNacimiento('02-03-1997');
        $test_name = 'Prueba ' . ++$i . ' - Prueba metodo calcular categoria menor';
        $expected_result = 1;

        $this->unit->run($test, $expected_result, $test_name);

        $test = $categoriaDAO->getCategoriaIdByFechaNacimiento('22-02-1990');
        $test_name = 'Prueba ' . ++$i . ' - Prueba metodo calcular categoria mayor';
        $expected_result = 3;

        $this->unit->run($test, $expected_result, $test_name);

        $test = $categoriaDAO->getCategoriaIdByFechaNacimiento('02-03-2012');
        $test_name = 'Prueba ' . ++$i . ' - Prueba metodo calcular categoria no nacido';
        $expected_result = False;

        $this->unit->run($test, $expected_result, $test_name);

        $test = $categoriaDAO->getCategoriaIdByFechaNacimiento('02-03-1900');
        $test_name = 'Prueba ' . ++$i . ' - Prueba metodo calcular categoria mayor a 99 años';
        $expected_result = False;

        $this->unit->run($test, $expected_result, $test_name);


        //Generación Reporte de Ejecución de las Pruebas

        echo $this->unit->report();
    }

}

?>
